package com.atguigu.gmall.payment.service.api;

import com.atguigu.gmall.model.order.OrderInfo;
import com.atguigu.gmall.model.payment.PaymentInfo;

import java.util.Map;

public interface PaymentService {
    /**
     * 根据订单 id 和支付方式查询 PaymentInfo 对象
     * @param orderId
     * @param paymentType
     * @return
     */
    PaymentInfo getPaymentInfoByIdAndType(Long orderId, String paymentType);

    /**
     * 保存 PaymentInfo 对象并把构造的 PaymentInfo 对象返回
     * @param orderInfo
     * @param paymentType
     * @return
     */
    PaymentInfo savePaymentInfo(OrderInfo orderInfo, String paymentType);

    /**
     * 根据订单号和支付方式查询 PaymentInfo 对象
     * @param outTradeNo
     * @param paymentType
     * @return
     */
    PaymentInfo getPaymentInfoByOutTradeNo(String outTradeNo, String paymentType);

    /**
     * 根据支付宝异步回调发送过来的数据更新本地 PaymentInfo
     * @param outTradeNo
     * @param paramsMap
     * @param paramsMap
     */
    void updatePaymentInfoByCallback(
            String outTradeNo,
            String paymentType,
            Map<String, String> paramsMap);

    /**
     * 针对 PaymentInfo 对象执行更新
     * @param paymentInfo
     */
    void updatePaymentInfoStatus(PaymentInfo paymentInfo);

    /**
     * 查询支付宝交易记录是否存在
     * 调用支付宝提供的：alipay.trade.query(统一收单线下交易查询)接口
     * @param outTradeNo 使用电商平台生成的『外部订单号』是方便订单模块远程调用我们支付模块时方便提供这个值
     * @return 返回支付宝交易记录查询结果
     *      true：说明在支付宝平台上，该交易记录存在
     *      false：说明在支付宝平台上，该交易记录不存在
     */
    boolean queryAliPayTradeExists(String outTradeNo);

    /**
     * 关闭支付宝交易记录
     * @param outTradeNo 使用电商平台生成的『外部订单号』是方便订单模块远程调用我们支付模块时方便提供这个值
     * @return 返回操作执行结果
     *      true：关闭成功，说明此前用户尚未支付
     *      false：关闭失败，说明此事用户已经支付
     */
    boolean closeAliPayTrade(String outTradeNo);

    /**
     * 关闭 PaymentInfo
     * @param orderId
     */
    void closePaymentInfo(Long orderId);
}
